package com.phonetools.commonutils.widget

import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.annotation.ColorRes
import androidx.core.content.ContextCompat
import java.util.*

/**
 * TextView滚动到最底部
 */
fun TextView.scrollToBottom() {
    if (this.text.toString().isEmpty()) {
        this.scrollTo(0, 0)
        return
    }
    val offset = this.lineCount * this.lineHeight
    if (offset > (this.height - this.lineHeight) - 20) {
        this.scrollTo(0, offset - this.height + this.lineHeight + 20)
    }
}

/**
 * 设置TextView的字体颜色
 * @param  id
 */
fun TextView.setTextColorRes(@ColorRes id: Int) {
    this.setTextColor(ContextCompat.getColor(this.context, id))
}

/**
 * 设置TextView的背景颜色
 * @param  id
 */
fun TextView.setBackgroundColorRes(@ColorRes id: Int) {
    this.setBackgroundColor(ContextCompat.getColor(this.context, id))
}

/**
 * 搜索关键字
 * @param keyword 关键字
 * @param ignoreCase 忽略大小写
 * @return 返回关键字在全文中的所在行数
 */
fun getKeywordLines(textView: TextView, keyword: String, ignoreCase: Boolean = false): List<Int> {
    val posList = getKeywordPositions(textView, keyword, ignoreCase)
    return posList.map { textView.layout.getLineForOffset(it) }
}

/**
 * 搜索关键字
 * @param keyword 关键字
 * @param ignoreCase 忽略大小写
 * @return 返回关键字在全文中的位置
 */
fun getKeywordPositions(textView: TextView, keyword: String, ignoreCase: Boolean = false): List<Int> {
    val content = if (ignoreCase) {
        textView.text.toString().lowercase()
    } else {
        textView.text.toString()
    }

    val key = if (ignoreCase) {
        keyword.lowercase()
    } else {
        keyword
    }

    return Regex(key).findAll(content).toList().map { it.range.first }
}

/**
 * 搜索关键字
 * @param keyword 关键字
 * @param ignoreCase 忽略大小写
 * 返回关键字在全文中的所在行的偏移位置
 */
fun getKeywordLineOffsets(textView: TextView, keyword: String, ignoreCase: Boolean = false): List<Int> {
    val lines = getKeywordLines(textView, keyword, ignoreCase)
    return lines.map { textView.layout.getLineTop(it) }
}

/**
 * 设置TextView的miniLines参数
 * 用于解决Dialog内的TextView无法自动适应屏幕高度的问题
 */
fun TextView.autoMinLines() {
    val textView = this
    textView.post { textView.minLines = textView.lineCount }
}

/**
 * 解决Dialog屏幕适配问题
 * autoSize框架，会导致dialog无法自适应高度
 * 需要在basedDialog的onActivityCreated里设置所有TextView的minLines来解决
 */
fun findTextViewSetMinLines(view: View) {
    if (view is TextView) {
        view.autoMinLines()
    }

    if (view is ViewGroup) {
        for (i in 0 until view.childCount) {
            val innerView = view.getChildAt(i)
            findTextViewSetMinLines(innerView)
        }
    }
}